package com.td.filemanager.ui;

import com.td.filemanager.ResourceTable;
import com.td.library.data.DeviceData;
import com.td.filemanager.business.device.DeviceDataProvider;
import com.td.library.utils.LogUtil;
import ohos.aafwk.ability.AbilitySlice;
import ohos.agp.components.Component;
import ohos.agp.components.LayoutScatter;
import ohos.agp.components.ListContainer;
import ohos.agp.components.Text;
import ohos.agp.utils.LayoutAlignment;
import ohos.agp.window.dialog.CommonDialog;
import ohos.distributedschedule.interwork.DeviceInfo;
import ohos.distributedschedule.interwork.DeviceManager;

import java.util.ArrayList;
import java.util.List;

import static ohos.agp.components.ComponentContainer.LayoutConfig.MATCH_CONTENT;
import static ohos.agp.components.ComponentContainer.LayoutConfig.MATCH_PARENT;

/**
 * 设备选择对话sagg
 */
public class DeviceSelectDialog extends CommonDialog {
    private static final String TAG = DeviceSelectDialog.class.getSimpleName();

    // 角半径
    private static final int CORNER_RADIUS = 10;

    // Slice变量
    private final AbilitySlice context;

    // 设备信息
    private DeviceInfo checkedDevice;

    /**
     * 构造方法
     * @param context 上下文对象
     */
    public DeviceSelectDialog(AbilitySlice context) {
        super(context);
        this.context = context;
    }

    @Override
    protected void onCreate() {
        super.onCreate();
        // 获取在线设备信息
        List<DeviceData> deviceDataList = initDeviceData();
        // 获取设备对话框布局组件
        Component rootView = LayoutScatter.getInstance(context)
                .parse(ResourceTable.Layout_dialog_layout_device, null, false);
        // 在布局组件查找到设备列表组件
        ListContainer listContainer =
                (ListContainer) rootView.findComponentById(ResourceTable.Id_list_container_device);
        // 填充数据到设备列表组件
        setItemProvider(listContainer, deviceDataList);
        // 配置选择按钮点击事件
        configChoiceButton(rootView);
        // 配置样式
        configStyle(rootView);
    }

    /**
     * 配置样式
     * @param rootView 根布局
     */
    private void configStyle(Component rootView) {
        LogUtil.info(TAG, "start config dialog style");
        // 设置对话框大小
        setSize(MATCH_PARENT, MATCH_CONTENT);
        // 显示位置在底部
        setAlignment(LayoutAlignment.BOTTOM);
        // 角半径，圆角
        setCornerRadius(CORNER_RADIUS);
        // 自动关闭
        setAutoClosable(true);
        // 显示内容组件为rootView
        setContentCustomComponent(rootView);
        // 透明显示
        setTransparent(true);
    }

    /**
     * 配置选择按钮点击事件
     * @param rootView 根布局
     */
    private void configChoiceButton(Component rootView) {
        LogUtil.info(TAG, "start config select button");
        // 获取对话框里Yes文本组件
        Text operateYes = (Text)rootView.findComponentById(ResourceTable.Id_operate_yes);
        // Yes文本组件点击关闭事件
        operateYes.setClickedListener(component -> destroy());
        // 获取对话框里No文本组件
        Text operateNo = (Text)rootView.findComponentById(ResourceTable.Id_operate_no);
        // No文本组件点击关闭事件
        operateNo.setClickedListener(component -> destroy());
    }

    /**
     * 填充数据到设备列表组件
     * @param listContainer 列表容器
     * @param deviceDataList 设备数据列表
     */
    private void setItemProvider(ListContainer listContainer, List<DeviceData> deviceDataList) {
        LogUtil.info(TAG, "start to fill data to device list");
        DeviceDataProvider deviceDataProvider = new DeviceDataProvider(context, deviceDataList, ResourceTable.Layout_dialog_device_item);
        listContainer.setItemProvider(deviceDataProvider);
    }

    /**
     * 获取在线设备信息
     * @return 在线设备信息
     */
    private List<DeviceData> initDeviceData() {
        LogUtil.info(TAG, "start initDeviceData");
        // 获取在线设备信息
        List<DeviceInfo> deviceInfoList = DeviceManager.getDeviceList(DeviceInfo.FLAG_GET_ONLINE_DEVICE);
        // 初始一个设备列表保存设备信息
        List<DeviceData> deviceDataList = new ArrayList<>();

        // 默认选择第一个设备
        if (deviceInfoList.size() > 0) {
            checkedDevice = deviceInfoList.get(0);
        }

        LogUtil.info(TAG, "get " + deviceInfoList.size() + " device info");
        return deviceDataList;
    }
}
